Skip to content
On this page

实战篇 4-商品列表页开发及性能优化


商品列表页开发及性能优化

Taro 是一个高效的多端框架,在列表渲染时内部会对图片进行懒加载处理,对 diff 函数有做优化。本节会给大家分享一下如何使用 Taro 开发商品列表页及性能优化。

案例项目里的搜索列表页包含的组件有:搜索、筛选条件、搜索结果列表等。 这里主要讲搜索列表。

涉及的知识点如下:

  • 列表渲染
  • 数据请求 (Taro.request)
  • 分页的实现

实现的页面

从上图可以看出整个搜索列表页的结构,笔者分成了 6个组件:

  • 吸顶的搜索头部
  • 热搜
  • 历史搜索
  • 搜索条件
  • 商品列表展示
  • 搜索结果状态

从布局结构可以看出,整个搜索列表页的实现难度主要集中在数据拉取与展示搜索条件选项的选择

列表渲染

使用 Taro 渲染列表,类似于 JavaScript 中通过 map 将数组转化为一个数列相似,我们可以使用如下:

  const { list } = this.state
  const renderList = list.map((item, index) => {
    return (
      <View className='item' key={index}>{item.text}</View>
    )
  })
  return (  
    <View className='jingo_detail_content'>
      {renderList}
    </View>
  )

key 作为索引,它必须满足三个条件:稳定、可预测、唯一。 建议尽可能在使用 map 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

数据请求

Taro.request 用法和 wx.request 差不多,支持 promise 和跨域。 由于筛选条件和前面拆分的组件相对较多,并且组件之间的通信较为繁琐,所以用 Redux 作为数据状态管理工具。

import Taro from '@tarojs/taro'

Taro.request({
  url,
  data: {},
  header: {
    'content-type': 'application/json'
  }
})
  .then(res => console.log(res.data))

在进行数据搜索的时候,先进行 Dispatch(actionMap'requestSearch'),这样可以更新组件的状态,显示搜索结果,关闭热搜和历史搜索。

分页

本项目采用的是后端进行分页,前端通过滚动到底部触发回调函数去发起请求。然后将请求到的新数据加入 List 中。

滚动到底部触发的事件有两种方式:

  • ScrollView 中可以绑定 onReachBottom
  • Taro 中页面的 onReachBottom 事件,仅在小程序中支持。
 onReachBottom () {
    this.goSearchWords({page: searchResult.page + 1})
  }

可以设置 onReachBottomDistance 属性,距离底部稍远开始触发事件:

  config = {
    navigationBarTitleText: '搜索列表',
    onReachBottomDistance: 300,
  }

筛选条件选择

根据页面我们可以看出有很多筛选方式,笔者在 Redux 中提供了很多种状态,这样在处理每个流程就会很清晰,互不影响。

比如更新搜索结果如下:

  [RECEIVE_SEARCH_RESULT] (state, action) {
    return {
      ...state,
      searchResult: action.payload
    }
  }

解决列表页数据长度

刚开始所有商品平铺,拉接口分页展示,但这样展示下来会有一问题,就是随着数据量的增加会造成invokeWebviewMethod 数据传输长度为 1227297 已经超过最大长度 1048576。超出的数据将无法继续渲染的问题。为了解决这个问题,总结以下三个方案:

方案一: 去掉不必要的字段

这种方法其实很简单,就是对每个商品对应的参数进行处理,如本章开头的效果图所示,我们需要的内容就是:图片、商品名称、描述、商品 ID、价格,再看下接口返回的数据如下:

我们可以过滤参数,只取我们需要的。

总结: 这种方式如果数据库商品不多,是可以这样进行处理,但是当分页一直进行下去,总会超出数据的传输长度,所以还是未能从根本上解决这个问题。

方案二:二维数组

这种方法是在微信开发者论坛上找到的,解决方案的链接,这种方案测试还是可行的,测试加载了几十页都没问题。

方案三:大分页思想

大分页思想其实很简单,就是在下拉列表记录当前分页,达到 10页的时候,就以 10页为分割点,将当前 setState 的 List 取分割点后面的数据,判断滚动向前滚动就将前面数据 setState 进去,流程图如下:

按照上面的流程解决了数据分页问题,但是当页面往回滚动的时候,需要将 List 重新 setState,目前采用的是滚动距离顶部小于 500 时,就判定用户在进行上滚操作,List 取上一个大分页的数据。

结论

通过上述的方案,方案二其实最符合要求,方案三会有个切换数据卡顿的现象。

小结

本文从页面布局、数据拉取、列表筛选等方面阐述了如何使用 Taro 开发搜索列表页。主要是从原理,架构的角度去剖析一个列表页面的开发,并没有过于针对某些代码细节。一个是代码太长太多,全部贴出来解释也不现实;主要难点在于数据的无限加载。

在下一章节中我们将介绍商品详情页开发。